===============================================================================
                      GreenTeaSpeak 2 - Client-Changelog
                       Copyright GreenTeaSpeak Systems
                          https://www.greenteaspeak.de
===============================================================================
   + Neue Funktion oder spürbare Verbesserung
   - Fehlerbehebung oder Entferntes
   * Änderung oder Hinweis
   ! Wichtig — bitte beachten!
===============================================================================

* Hinweis: Ältere Versionsblöcke können noch englische Historie enthalten;
  neue Einträge ab 2.10.9 werden parallel DE+EN geführt.

2.10.10:

2.10.9:
- Obere Toolbar: Aktions-Icons (Mikrofon, Lautsprecher, Aufnahme, Abonnieren, Abwesend,
  Bildschirmfreigabe, Host-Button) von 16 auf 18 px vergrößert — besser lesbar, Button-
  Hitbox unverändert
- Einladungs-/Connect-Links (gts2server://, ts3server://): ein „+“ im Token/Passwort
  wurde beim Parsen zu einem Leerzeichen (und ein führendes „+“ ganz verschluckt),
  sodass Base64-Werte wie „+cH9…“ kaputtgingen und der Beitritt scheiterte — „+“
  bleibt jetzt erhalten
+ Changelogs: plattformweise Dateien unter github/changelog/ (linux.de.txt / linux.en.txt);
  What's New wählt Linux + UI-Sprache (Deutsch → .de, sonst .en)
+ UI-Themen: bearbeitbare User-Vorlage (resources/themes/_user_template) mit theme.css /
  theme.json; Einstellungen → Erweiterungen → Themen → „Aus Vorlage anlegen…“ kopiert
  sie nach userData/themes, aktiviert sie und öffnet den Ordner zum Bearbeiten
* UI-Themen: mitgelieferte User-Vorlage ist jetzt ein LCARS-Theme (schwarzer Void,
  Peach/Cyan/Teal/Gold/Lavender, flache CSS-Variablen)
+ Aufnahme: Start/Stopp der WAV-Aufnahme spielt jetzt einen Soundpack-Hinweis
  (recording.started / recording.stopped); der eigene Aufnahmestatus wird über
  client_is_recording gesendet, sodass alle im Channel „Aufnahme gestartet/beendet“
  hören und sehen, sobald der Server das Flag weiterleitet (TeamSpeak-artige Meldung)


2.10.8:
- Crash-Reporter: Electron-/EXE-Pfade im nativen Crash-Callback quoten, damit
  Installations- oder Repo-Pfade mit Leerzeichen (z. B. "GreenTeaSpeak 2", "GTS2 Client")
  die Crash-UI nach einem Dump wirklich starten
* Linux-Audio-Einstellungen: nur TeamSpeak-artige Backends — Automatisch besten Modus,
  ALSA, PulseAudio (PipeWire-via-Pulse und miniaudio-auto aus der UI entfernt; Legacy-
  Prefs mapen auf auto)
- Linux-Gerätelisten: ALSA-Plugin-/Virtual-PCMs ausblenden (sysdefault, lavrate,
  samplerate, speexrate, pipewire, pulse, speex, upmix, vdownmix, default, …), damit
  Capture/Playback-Picker echte hw:X,Y und Pulse-Sink/Source-Namen zeigen
- Linux Pulse/auto-Gerätelisten: keine PortAudio-ALSA-Aliase (sysdefault_ALSA usw.) oder
  rohe hw:X,Y leaken; Pulse/PipeWire-Beschreibungen via pactl (TeamSpeak-Stil). ALSA-Modus
  listet weiterhin nur echte hw/plughw-Karten
* Linux-Voice (schwache CPU): PortAudio hohe Latenz (≥80ms) + 40ms Perioden, Mono-Capture,
  WebRTC ProcessStream überspringen wenn DSP aus, soxr QQ Resample; JS-Jitter Standard
  180ms (GTS_AUDIO_LOW_CPU=1 → 250ms)
- Linux: Capture-Wechsel Pulse→ALSA crasht nicht mehr nativ — audio.finalize() überspringen,
  wenn set_capture_backend fehlt (PortAudio), Soft-Switch serialisieren, nach Close settlen,
  -9985 / busy hw mit Pulse-Bridge-Fallback statt SIGSEGV ohne Crash-Dump

2.10.7:
- Updater: Version.isDevelopmentVersion() wiederhergestellt (entfernt durch SemVer-first-
  Compare) — ohne sie warf refreshUpdaterStatus und die UI blieb bei
  "Checking…" / "Wird geprüft…" hängen (kein Aktualitäts-/Fehler-/Update-Status)
* Updater: kompletten Update-Check-Pfad absichern, damit unerwartete Fehler und API-
  Timeouts den "checking"-Zustand immer mit klarer Fehlermeldung verlassen
* Updater-UI: wenn refresh-IPC ohne onStatus rejected, Fehler zeigen statt endlosem
  Prüfen; deutscher Aktualitäts-Titel → "Client ist aktuell"
- Updater: SemVer ist maßgeblich — gleiches X.Y.Z bietet kein Update mehr an, wenn der
  lokale Build-Timestamp bereits >= remote ist (Timestamp nur bei Same-SemVer-Rebuilds;
  nie SemVer-Downgrade über neueren Stempel erzwingen)
- Linux/Windows folder-update: app-info.json + ChangeLog.txt immer in Install-Root und
  resources/ syncen, damit der nächste Check zum ausgelieferten Paket passt
* loadAppInfo: auch resources/app-info.json lesen (deb/extraResources); neuesten Kandidaten
  wählen, damit ein veralteter Root-Stempel nach erfolgreichem Update nicht erneut fragt
* Linux/Windows Release-Skripte + electron-builder extraResources: app-info.json und
  ChangeLog.txt neben dem asar ausliefern (nicht nur darin)
- Linux-Release-Skript: cp überspringen, wenn extraResources app-info/ChangeLog bereits
  nach resources/ hardlinkt (GNU cp "same file" ließ CI scheitern)

2.10.6:
* Elevation-Prompt-Text: /opt und polkit erwähnen (nicht nur Windows-Formulierung)
- Linux-Updater: wenn Install-Ordner nicht schreibbar (z. B. /opt), Admin-Rechte via
  pkexec/polkit anfordern (grafischer Passwortdialog); zenity/kdialog + sudo-Fallback —
  kein stilles Hängen ohne UI (folder-update + AppImage)

2.10.5:
- Linux updater: accept linux-unpacked/greenteaspeak2 (and AppImage) packages instead of requiring Windows Setup.exe; apply folder-update via in-place copy after quit
* Repo: gitignore local `secrets` file (never commit upload credentials)
- Linux RPM: drop bogus Requires (libabsl / libwebrtc-audio-processing) that do not
  exist on Fedora/openSUSE and blocked PackageKit/Discover installs; WebRTC/Abseil
  .so stay bundled under resources/natives — restore electron-builder default RPM deps
* Linux RPM: packageName greenteaspeak2 (was npm name greenteaclient); artifact
  greenteaspeak2-{version}.{arch}.rpm so Discover no longer shows GreenTeaSpeak2-2
  from the ambiguous GreenTeaSpeak2-{version}-x64.rpm filename
* Linux updater: download uses platform/arch from update-info and logs them (API channel beta → version folder suffix b server-side)
* Linux CI: refresh SFTP/FTP Actions secrets from local credentials sheet;
  shorten default FTP connect timeout to 60s (faster fail on ETIMEDOUT)

2.10.4:
- Soundpack download: extract ZIP/.ts3_soundpack via unzip (GNU tar cannot open ZIP —
  "Das sieht nicht wie ein tar-Archiv aus"); reject HTML error pages
- Multi-tab voice: keep native playback bind on a connected tab while a new tab
  is still connecting; rewarm VoiceClients after attach/rebind (fixes dead output
  on new-tab connect); exclusive mic mute on other tabs when an additional unmuted
  tab is spawned
* .gitignore: keep native/build/linux_x64 (and win32_x64) explicitly tracked
- Linux CI: dist-linux-docker no longer auto-mounts/probes a Windows teaspeak-bundle
- Connect: clientupdate client_platform follows host OS (Linux/macOS/Windows)
  instead of always announcing Windows
* gts2 API: beta/nightly download URLs use release-{arch}.tar.gz (same deploy
  archive name as Windows; channel = version-folder suffix b/n)
* Runtime: logs expected NODE_MODULE_VERSION on native load failure
* Linux CI: upload to beta path client2/linux/{version}b/ (CHANNEL=beta / app-info
  clientChannel); gtsuploader folder suffix b=beta, a=nightly
* Linux CI: upload SFTP/FTP automatically after a green build on master
  (no workflow_dispatch checkbox)
* Linux CI: treat ABI verify as passed when natives load; ignore Electron
  teardown SIGSEGV after ABI_VERIFY_PASSED
* Linux CI: install rpm (rpmbuild) so electron-builder can produce .rpm
* Linux CI: FTP metadata write retries + 5m timeout (fixes control-socket timeout
  after successful SFTP artifact upload)
- Linux: rebuild teaclient_*.node with Electron 33 V8 defines
  (V8_COMPRESS_POINTERS / V8_ENABLE_SANDBOX) — fixes startup SIGSEGV in Nan
  ObjectWrap / GetInternalField
- Linux: ship/link libsoxr.so.0 with teaclient_connection (fixes
  `undefined symbol: soxr_create` after connect)
- Linux: export audio.finalize / set_*_backend on teaclient_connection;
  NativeVoiceController uses platform default backends (not wasapi) so Apply
  no longer hard-restarts and errors with "finalize is not a function"
- Linux: talk lamps — accept server client_flag_talking=1 and BUFFERING
  packet hints when native PLAYING callbacks lag (PortAudio)
- Linux: own talk lamp — show self talking without ownChannelId gate; re-assert
  continuous TX after voice handler bind; AudioConsumer starts in "ended" so
  callback_started fires on first open
- Linux: prefer brand/logo-128.png for window icons (.ico fails in Electron setIcon)
+ Linux: native host build via `scripts/dist-linux.sh` / `npm run dist:linux`
  (no Docker required on Linux); `dist:linux:dir` for unpacked-only
+ Linux: rebuild teaclient_*.node for Electron 33 (ABI 130) and ship in
  native/build/linux_x64 (previous in-repo modules were ABI 76)
* Linux: dist:linux installs missing rollup/esbuild optional binaries and
  restores +x on app-builder after Windows/Synology sync
* Linux CI: re-enable ABI verify — committed linux_x64 is Electron 33 (ABI 130);
  remove GTS_SKIP_ABI_VERIFY workaround
* Linux CI: install Electron runtime libs (libnss3/gtk/gbm/xvfb) on the runner
  so host `dist:linux` ABI verify no longer exits 127
* Linux CI: apt-get update uses Acquire::Max-FutureTime=86400 so runner clock
  skew vs packages.microsoft.com no longer fails the deps step (exit 100)
* Linux CI: install libjack + libunbound for ABI verify; ship libevent 2.2
  next to teaclient_dns ($ORIGIN RUNPATH) — fixes hang on missing .so
* Linux CI: packages committed native/build/linux_x64 only — no external
  TeaSpeak/teaspeak-bundle clone; GTS_TEASPEAK_BUNDLE_* secrets no longer used
* Docs: .gitea/SECRETS-linux-natives.md — delete REPO/TOKEN/REF/PATH secrets
* Docs: Gitea secrets fill-in sheet for Linux upload (`.gitea/SECRETS-upload-linux.md`)
- Linux: ship TeaSpeak natives under native/build/linux_x64 and fail packaging
  if teaclient_connection.node is missing from the AppImage/RPM/deb resources
+ Linux: rebuild-natives-linux.sh / ensure-linux-natives.sh (Electron 33 ABI);
  Linux error hint no longer points only at Windows .ps1
+ Linux: electron-builder also ships GreenTeaSpeak2-{version}-{arch}.deb;
  Gitea build-linux uploads .deb with AppImage/RPM/tar.gz
+ Linux: SFTP+FTP release upload (gtsuploader layout) — script
  scripts/upload-linux/ plus Gitea build-linux upload=true and upload-linux.yml;
  deploys client2/linux/{version}/ and merges gts2/updates.linux.json
* Updater: send platform=linux (and arch) on Linux; gts2 API accepts linux/
  darwin download targets and merges updates.linux.json
- Linux connect: bundle libwebrtc-audio-processing-1.so.3 (+ Abseil SONAMEs)
  next to teaclient_connection.node; package **/*.so* via extraResources;
  preload with RTLD_GLOBAL / LD_LIBRARY_PATH; deb/rpm depends as fallback
  (fixes “Kann die Shared-Object-Datei nicht öffnen” on connect)
! Linux: AppImage ABI gate — verify committed linux_x64 under Electron 33
  (NODE_MODULE_VERSION 130) before pack; refresh by committing new natives
- Linux: ensure-linux-natives defaults to in-repo modules; optional local
  rebuild only when GTS_TEASPEAK_BUNDLE + GTS_FORCE_NATIVE_REBUILD=1

2.10.3:
- Video: camera/screen broadcast keeps running on the server where it was
  started when switching connection tabs — TX is bound to the owner
  connection (not UI focus); toolbar shows sharing only on that tab
* Settings: rename Forum nav to myGreenteaspeak and move it to the top of
  General (Allgemein); remove empty Identity section
* Settings: myGreenteaspeak page title/copy (was Forumverbindung); show
  account email on the connected card when the forum API provides it; use
  the GTS2 app icon for the myGreenteaspeak nav entry

2.10.2:
- Audio: headset / default-device hotplug — soft-rebind capture+playback when
  WASAPI devices disappear or return (no full app restart); capture health
  pokes start() so stream_invalid recovers while send stays enabled
- Talk lamps: peer indicators stay off while BUFFERING|STOPPED; packet hints
  no longer refresh BUFFERING into a Dauerlampe; callback_playback only lights
  when already audible (PLAYING|STOPPING)

2.10.1:
- Away: status no longer clears when switching connection tabs — each tab keeps
  its own away flag/message; toolbar Away follows the focused tab; All servers
  applies to every open connection
- Video: watching another client's camera/screen while your own camera is on
  works again — Markus-style extra recvonly video m-lines, canvas fallback
  SSRCs on camera/screen slots, local ICE buffered until the remote
  description is set, and soft-ignore of UnknownMediaChannel (1792) ICE races
- Channel video: hide own broadcast from the remote watch list (local preview
  only), matching Markus LocalClientEntry filtering
- Video watch: stop leave+rtcsessionreset loop — trailing empty
  notifybroadcastvideo rows no longer wipe the channel list mid-watch; UI
  debounces vanish; no double leave/reset (fixes ICE Unauthorized / bad
  local username storm after join)
- Poke (Anstupser): multi-poke received window — card rows with avatar
  initials, clearer nick/time/message hierarchy; scrollbar only when needed
- Poke (Anstupser): stay above the main window when the client is already in
  the foreground (owned/modal child + AOT; no flash-main race before show)
- Screen share: system/desktop audio actually reaches peers — after loopback
  capture, send TeaSpeak `broadcastaudio` with the audio SSRC (Markus path);
  prior fix attached the track locally but never started the channel broadcast
- Screen share: capture video via chromeMediaSourceId and loopback via a
  separate getDisplayMedia grant (Windows window+loopback was silent/empty)
+ Icons: flood/antiflood throttle plus quieter connect (fewer icon storms)
+ Talk status: Markus-aligned peer indicators (PLAYING|STOPPING); PTT
  send-enable so local talk lamp matches actual TX
+ Voice: multi-tab exclusive TX — unmute claims one speak tab; UI focus may
  stay on another muted tab (Markus-style work Tab1 / speak Tab2)
+ Audio: playback amplifier setting for louder remote voice
+ Server admin: Alle Clients list; Ban list CRUD; Nachrichten presets
  (away / kick / ban texts)
+ UI: modern kick/ban dialogs with ban preset picker
+ Connection: middle-click connection info; notifyconnectioninfo wait fix
+ Channel tree: moderated-channel icon (client-moderated with M badge)
- Client hang: softer command-path probe (less aggressive whoami recovery)
- News ticker: soft-fail so a bad feed no longer blocks the UI
- CSS: global.css truncation fix (styles no longer cut off mid-rule)

2.10.0:
* Initial 2.10.x line after 2.9.9 carry; release notes continued under 2.10.1

2.9.9:
* Release skipped in semver sequence (patch max 9 carried 2.9.9 → 2.10.0);
  notes shipped under 2.10.0 / 2.10.1

2.9.8:
- Voice: rebuild Opus without OPUS_X86_PRESUME_SSE4_1 (RTCD only) and bypass
  WebRTC AudioProcessing::ProcessStream on capture — fixes remaining
  STATUS_ILLEGAL_INSTRUCTION (0xC000001D) on talk after 2.9.7 AGC-off path
  (repro: Opened WASAPI capture → encode queue → crash in teaclient_connection)

2.9.7:
- Voice: fix main-process crash when starting to talk (STATUS_ILLEGAL_INSTRUCTION
  0xC000001D in teaclient_connection) — stop applying FixedDigital WebRTC capture
  AGC; disable AGC/AEC/NS/VAD on capture so SSE4.1 process paths are not forced
  on CPUs that abort there (repro: PTT/unmute → Opened WASAPI capture → crash)
- Channel tree: multi-select / multi-move hold-key works again with side-specific
  bindings (Alt Links / Strg Links) — captureBinding stored altleft/ctrlleft but
  the matcher only accepted bare alt/ctrl; also ignore Dead-key mis-captures

2.9.6:
+ Plugins: Tools menu lists installed UI plugins; Soundboard plugin sends WAV
  clips into the voice channel (mic TX mix, local monitor, hotkeys)
+ Channel tree: drag-and-drop channel reorder/move with server sync
+ Talk status: multi-user talk lamps stay reliable (voice-packet activity +
  sticky talk-indicator watchdog)
+ File browser: download/rename/delete, drag-and-drop upload, multi-select,
  progress, and dedicated Electron window
- Audio: Opus corrupted-stream / whisper UID handling; clearer outbound mic
  (capture DSP + higher Opus send bitrate)
+ Icons: country flags in the client tree/info panel from local SVG map
+ UI: TeamSpeak-style brand watermark in the info panel and chat log

2.9.5:
+ Crash dialog: optional upload of minidump plus the last two client logs to
  https://greenteaspeak.de/bug-report (multipart form; best-effort, no secrets)
* Natives: Electron 33 ABI 130 rebuild includes VoiceClient force_replay UAF
  fix (ACCESS_VIOLATION on duplicate stop / stream-timeout packets)

2.9.4:
+ Icons: server group menu icons load via MenuIconLoader with SHA1 disk cache
  (faster reopen, fewer duplicate downloads)
+ Audio: WAV recording of mic + remote mix for local capture/review
- Settings: crash-safe prefs — atomic JSON writes (temp+rename) plus .bak
  restore so a mid-write crash no longer resets audio devices / identities /
  bookmarks to defaults; corrupt files are quarantined, never wiped silently
- Talk lamps: packet-primary hang no longer leaves peer lamps stuck on
- Connection: command-path recovery — whoami probe before connection-lost;
  getconnectioninfo / clientmove timeouts handled without false disconnects
- Audio: Opus corrupted-stream / whisper UID fix; native log rate-limit for
  spammy decode errors
- Voice: fix main-process crash (ACCESS_VIOLATION in teaclient_connection) when
  an old/duplicate stop or stream-timeout packet deleted a buffer still held by
  force_replay — clear force_replay before delete
* Natives: Electron 33 ABI 130 (teaclient_*.node) required for GTS2

2.9.3:
- Update: refuse GTS1 / legacy packages on the GTS2 API (GreenTeaSpeak1-Setup,
  GTS1 - Legacy.exe, app-info major≠2) so a wrong deploy cannot overwrite GTS2

2.9.2:
- Talk status: multi-user talk lamps stay reliable via voice-packet activity
  plus a sticky talk-indicator watchdog (peers no longer stick on/off incorrectly)
- Audio: clearer outbound mic (less woolly/muffled) — capture DSP policy
  (FixedDigital AGC; AEC/HPF/AGC2 off) and Opus send bitrate 96 kbps
- Icons: after upload, cache put / forget disk so tree badges refresh without
  a stale HTTP/icon cache hit
* Natives: teaclient_*.node must be built for Electron 33 (ABI 130); wrong ABI
  yields "Module did not self-register" under GTS2

2.9.1:
- Audio: mic not sending after reconnect — detach/rebind capture and force
  send-state sync so transmit resumes after reconnect
+ Settings: custom disconnect/quit message
- Update: pass /allusers|/currentuser to Setup; re-stamp shortcut AppUserModelID
- Settings: do not overwrite saved mic/headphones when native audio falls back
  to default after update; pin userData to `%APPDATA%\GreenTeaSpeak 2` (migrate
  legacy `greenteaclient` folder if present)

2.9.0:

2.8.9:
- Away: status and message persist after the idle timeout fires (no longer
  cleared when the away timer expires)
- Away: enabling Away mutes the microphone; unmute is blocked while Away is
  active so the client cannot send audio in Away state
- Info panel: fall back to server info when channel details are unavailable
- Talk lamp: sticky own-client talk indicator watchdog so the lamp cannot
  remain stuck on after send stops

2.8.8:
- Audio: Chromium getUserMedia mic/echo tests disable autoGainControl so they
  cannot rewrite the Windows microphone mixer level
- Audio: device remapping no longer strips "(Brand …)" from labels — fixes
  false WASAPI remaps (e.g. RODECaster Chat→Main, Realtek→RODECaster) that
  caused quiet send and "no remote sound" on the wrong output
- Logging: filter native playback-state / fadeout spam; support logs keep
  device/volume/error lines; connection channel moves stay UI-only

2.8.7:
+ Screen share: optional system audio (Windows/Linux loopback) with the share —
  Discord-like default toggle; camera share never includes it
+ Screen share: switch window/screen mid-session via replaceTrack without full
  hangup (toolbar / Change opens picker; Stop stays on the preview)
+ Screen share: enable/disable share audio while broadcasting; viewers can
  mute/unmute remote share audio independently (autoplay stays muted until unmute)
- Talk lamp: own client indicator in the channel tree follows mic send again
  (continuous / PTT / VAD); uses configured Talk-Lämpchen color
- Talk lamp: switching continuous↔VAD while unmuted no longer leaves the own
  lamp dark or stuck on; device/audio restart no longer clears it after restore
- Talk lamp: server mute/talking echoes no longer overwrite the local own-client
  talk/mute state
- Tray: while talking the notification-area icon is replaced by a TeamSpeak-style
  talk-lamp orb (Talk-Lämpchen color); normal logo when idle, gray when
  muted/deafened; tooltip includes Talking / muted / deafened

2.8.6:
- Permissions: send permvalue as signed int32 (oldclient `value | 0`) so setting
  a server/channel group icon (i_icon_id CRC32 > 2^31-1) no longer kicks with
  "Invalid argument (failed to parse permvalue as i (stoi))"
- Permissions: after creating or renaming a server/channel group, refresh the
  open permission editor group list immediately (no close/reopen)
- Camera/video UX: remote watch tiles stay muted for Chromium autoplay (no more
  black preview); failed Watch leaves the server broadcast again (no orphan join)
- Camera/video UX: channel bar grid shows only streams you watch (chips still
  discover everyone); clearer empty hint instead of idle black tiles
- Camera share: live mirrored picker preview; denied/busy/missing camera errors
  instead of “no camera”; stop orphan tracks on start failure / unmount / disconnect

2.8.5:
* Build for updater verification (no functional changes)

2.8.4:
- Updater: log real Start-Process / spawn errors to the client log file
- i18n: updateInstallerStartFailed / updateInstallerMissing use real newlines
  (no literal \n in the error dialog)

2.8.3:
- Setup finish/update relaunch now uses ExecShellAsUser so an elevated installer
  cannot spawn GreenTeaSpeak 2.exe as administrator (false "UAC at client start")

2.8.2:

2.8.1:
- Updater: when Release channel has no packages, fall back to beta so the client
  is not stuck with "no updates" while Release is empty on the API
- Updater: compare build timestamps so same-semver rebuilds still offer an update

2.8.0:
- Antiflood: throttle/serialize server icon downloads (max 2 parallel, start gap,
  backoff on temporary FT failures); do not remount-retry 2051/flood errors
* Signed icon path retry on 2051 still applies, with a short delay between forms
- Voice: stop rewarming the full peer roster on every mute/PTT/send sync (was
  logging "rewarmed N … after audio restart" dozens of times per minute); rewarm
  only after a hard audio backend restart, coalesced
- Flood ban (3331): never auto-reconnect on ban/flood; show banned notice; if a
  reconnect is scheduled for other reasons, wait until ban expiry when parsed
- Updater: resolve PowerShell via SystemRoot (packaged PATH), await spawn success
  before exit, shut down voice/sessions before apply, surface start failures to
  the updater window instead of silently quitting

2.7.9:
- Server/group icons: on FT error 2051 (file not found), retry download with the
  int32 signed path form (`/icon_-N`) when the CRC32 id has the high bit set —
  classic TeamSpeak signed-vs-unsigned mismatch; do not cache 2051 until both forms fail
* Icon download warnings now include host, port, path, and error id
- Icon file list accepts signed `icon_-N` names from ftgetfilelist
* ftinitdownload/upload send empty `path=` like the oldclient (name still holds `/icon_…`)

2.7.8:

2.7.7:
* Updater: one-click happy path (download + apply, no second “Apply update” step); simpler progress copy; channel options moved under Advanced
* Desktop main process respects UI language (tray, native dialogs, window titles, VoIP/crash dialogs, disconnect notices)
- Server/channel/client icons load on servers with a non-default file transfer port (same notifystart* port path as channel files; retry instead of caching FT failures)

2.7.6:
+ UI languages: 10 locales (de, en, nl, pt, hu, es, ru, it, tr, pl) — language setting switches the full interface (menus, settings, dialogs, tray, connection logs)
* Language preference stores a stable locale code; OS language is used on first launch
- Voice: stop thinning peer jitter to 60ms (UI default / first volume edit); use 100ms and ignore live volume ticks on the hot path — cuts intermittent underflow fadeouts ("wolliger" / muffled peer audio)
- Voice: Opus FEC decode flag actually passed to opus_decode_float (was hardcoded 0 in the shipped native tree)
+ File transfer: auto-detect FT TCP port from server notifystart* (uses whatever the server configured — e.g. 30033 / 30303 / custom; last-resort fallback 30303 only if omitted)

2.7.5:
- Voice: enable Opus FEC on decode (was hardcoded off — one lost packet became an audible glitch)
- Voice: large packet-ID gaps (late join / rewarm) resync cleanly instead of "missing 12000 packets"
- Protocol: increment command resend_count (was never increased → endless "Resending 1 packets" for hours)
- Protocol: grow command reassembly buffer 32→128 (reduces underflow drops on long sessions)
- Protocol: match command ACKs by packet id & 0xFFFF (generation-safe)
- Uninstall/reinstall: force-kill "GreenTeaSpeak 2.exe" (tray) on init/install/uninstall so a leftover process cannot stay running after remove or during reinstall

2.7.4:
- Updater: wait for client PID exit before copy; relaunch EXE after update
+ Server group dialog: assignment window with checkboxes (not the permission editor)
- Log filenames use local time instead of UTC (fixes 23:25 names at 01:25)

2.7.3:
- Soft 3D: hard-block spatial peer volume at native layer (no distance duck / "wool blanket" / sock-in-mouth path)

2.7.2:
+ Updater: client relaunches automatically after update (Finish page skipped)
- Context menu: show server/channel group icons next to group names

2.7.1:
* Soft 3D / spatial gain fully disabled (kill switch) until muffled-audio investigation is done
- Connect: serialize all connects; replace same-server tab instead of spawning a second session (fixes Sweety/Sweety1 doppel-connect)
- Weblist connect: use selected identity / forum handshake (no anonymous second UID)
- Reconnect: block parallel resume+timer handshakes

2.7.0:
- Fixed: jitter buffer (80ms) was never actually applied due to wrong set order (max must be set before min); this caused constant near-zero buffering and frequent underflow fadeouts ("wool blanket" / muffled sound on peers)
* Update channel: Release channel is now available and selectable in settings

2.6.9:
- Playback no longer resets the jitter buffer on every volume tick (fixes intermittent muffled/"wool blanket" peer audio)
* Soft 3D: clear leftover spatial gains on connect when no plugin owns spatial; UI still does not drive audio

2.6.8:
- Soft 3D no longer ducks other users' volume in normal voice use; spatial gain only applies when a plugin (e.g. SaltyChat) drives it
* Soft 3D dialog: placement preview only; audio stays off until a plugin locks spatial
* Soft 3D persist: do not auto-enable from spatial-3d.json; remap placements by nickname

2.6.7:
+ Plugin runtime: install/enable plugins via Extensions (catalog ZIP or local folder)
+ Soft 3D / spatial voice engine and Extras → 3D Sound dialog (AFK placement)
+ Server Unique ID shown in the info panel and copyable from the context menu
+ Online catalog can download plugins (e.g. SaltyChat) separately from sound packs
* Server license labels: NPG (Non-Profit Gamer), CGL (Community Gamer License), AGHP (Authorized GreenTeaSpeak Host Provider)
- Audio Apply while connected: soft device switch instead of tearing down VoiceClients (no more silent peers until rejoin)
* Plugins are not shipped inside the installer; SDK is for developers only

2.6.6:
* Ship bundled sound packs as real files under resources/soundpacks (extraResources) so updates replace Speech Male/Female stereo WAVs for installed clients

2.6.5:
+ Sound pack catalog preview images are saved locally and shown for installed packs
+ Poke dialog: right-click copy/select-all; links in poke messages are clickable
* Bundled Speech (Male) / Speech (Female) sound packs converted from mono to stereo

2.6.4:
- Favorites: name collisions get (1)/(2) suffixes instead of doubling the label
- UI stays usable on server timeout / reconnect (disconnect, cancel, favorites)

2.6.3:
* Update channel: Beta is the default; Release stays grayed out until UPDATE_RELEASE_CHANNEL_ENABLED is flipped
- Sound pack selection from the online catalog survives restart and updates (hydrate, catalogId, download fixes)
- Mass move: coalesce leave/join/moved sounds (no triple spam; at most one cue after bulk)

2.6.2:
- Suppress whisper error 1804 spam when there are no whisper targets; stop sending on empty targets
+ Faster domain:port connect (skip TSDNS/SRV TCP probes for explicit host:port; DNS/status cache)
* Channel [*spacer…] repetitive spacers match oldclient behavior

2.6.1:
- Incoming whisper audio playback fixed (VOICE_WHISPER receive)
+ Remote whisper talk lamp in channel tree
* Whisper receive notification sound uses short soft shush (pissst) instead of chat ding

2.6.0:
+ Whisper lists with hold hotkeys (PTT-style; VAD ignored while whispering)
+ Whisper settings (Audio → Whisper): incoming rights, sound, history panel
* Whisper receive cue uses short soft shush (whisper_notify), not chat ding
+ Contacts: right-click friend/block, contacts dialog, custom display names
+ Configurable talk-lamp colors for Whisper and Channel Commander
+ Channel description and topic shown in the info panel
+ Undocked channel tree: “fold main window” keeps the tree open (X still quits)
- Fix alien/robot mic pitch on high sample-rate capture devices
- Fix native crash in audio event queue (null weak_ptr on disconnect/exit)
- Whisper no longer spams whisper.list.empty; empty sound removed
- Channel switch no longer plays a barrage of join sounds or false channel-edit sounds
- Duplicate permission error on failed client move removed
* Contacts show as [Custom Name] Nickname (no friend sphere icon)

2.5.9:
+ Light and dark theme support across the client UI
+ Talk lamp: idle state uses a darker color for clearer speaking feedback
+ Events and notifications wiring improved
+ Chat timestamps show the date; chat font size setting applies correctly
+ Screen and camera picker modernized; camera background blur and image options
- File browser no longer shows a duplicate title
- Fix bot:get-settings request handling
- Video UI styling corrected for light mode
* Screen/camera share performance improvements

2.5.8:
+ In-app browser (BrowserView): back/forward/reload; same URL re-opens with hard refresh
- Away-with-message dropdown works again when the info panel is hidden (tree-only layout)
- Channel tree colors: current channel blue, password yellow, full red (was inverted)
- Connect / homepage / weblist: use identity or last nickname instead of the default placeholder
- Push-to-talk: Left and Right Ctrl can be bound separately
- Move sounds no longer play two or three times for one client move
- File transfer finished sounds (upload/download)
- Native voice: auto-register speakers, 80ms jitter default, separate encode/decode threads (multi-speaker quality)
- Sound pack selection from the online catalog persists across updates
* Forum session soft-renew on startup after client updates
* Profiles: identity display name labeled as Nickname for new connections

2.5.7:

2.5.6:
+ Server edit dialog: modern GTS2 layout with sidebar categories (General, Host, …)
+ Permission editor: modern GTS2 shell, sidebar navigation, window-filling layout
+ Group members: add clients via clear modal (DB-ID or Unique ID) instead of cramped inline fields
- Server edit: default groups selectable by name; server nicknames display-only in the dialog
* Permission editor primary actions use GTS2 green styling

2.5.5:

2.5.4:
- Connect: "Connected" status appears immediately after the channel list loads; roster subscribe runs in the background
- Sound packs: connect chime plays right away (no wait for imported-pack scan); only connection.connected on join (no spurious channel.edited during bootstrap)
- Permission editor: fixed blank window, flickering, and duplicate loading; cache-first group list and stable tab switching

2.5.3:
- Updater: apply update exits immediately so the installer or in-place copy can replace locked files (fixes update not starting after apply)

2.5.2:
- Audio: remap legacy native device ids (ma-out:/ma-in:) by device name; fall back to default instead of invalid device id on apply
- Microphone settings: native level meter for mic test when using miniaudio (live level bar works again)

2.5.1:
- Sound packs: play via stable HTML audio on the configured output device (Chromium setSinkId with native device name mapping)
- Sound packs: no longer use native playback_sound path (fixes cut-off, stutter, and crash on long sounds)

2.5.0:
+ Channel file browser: context menu for download, rename (F2), and delete
+ Hotkeys: multi-client selection / multi-move hold key is configurable (any key or modifier; default Alt)
- Permission editor: integer/grant fields are editable again; active tab scopes rights (no mixing across tabs)
* Extensions browser UI cleaned up (toolbar, list rows); Themes/Plugins remain disabled for now

2.4.9:
+ Settings → Extensions: browse and download sound packs from greenteaspeak.de (online catalog with install progress)
+ Only Speech sound packs ship with the installer; Kleiner Nils, Military (English), and GTS2 are available via the online catalog
* Themes and Plugins categories are shown but disabled until supported

2.4.8:
+ Bundled sound packs: Speech (Male), Speech (Female), Kleiner Nils (by Struppi), and Military (English)
+ sound packs: GTS event mapping generated from settings.ini (join/move/chat sounds work correctly)
- Sound pack event sounds are suppressed while deaf (speaker off)
- Fix startup crash when loading imported  sound packs (mapping module bundled in main process)

2.4.7:
+ Multi-client move: Ctrl+drag over clients to add to selection; own client can be included and moves with the group
+ Bulk move plays the move sound once instead of once per client
- Channels are no longer included in Ctrl+click or Ctrl+drag multi-selection
- Bundle MSVC runtime DLLs (vcruntime140, msvcp140) so native modules load on PCs without Visual C++ Redist
- Fix connection log language helper import on startup

2.4.6:
+ VoIP blacklist check via license server (SRV/DNS resolve to IPv4, API true/marked/false)
+ Blacklisted servers: warning dialog, red session log entry, connection rejected
+ Marked (suspicious) servers: warning dialog with Continue/Cancel; red log entry
- Blacklist warning shows again on each new connect attempt; no IPC error stack trace on reject
- Server chat tab (server-root) can no longer be closed

2.4.5:
+ File browser: rename files and folders (F2), drag-and-drop upload
+ Move multiple clients at once (Ctrl+click selection, context menu, drag-and-drop)
+ Close any chat tab including channel chats; close all chats from context menu
+ Application language auto-detected from OS on first start; connection log messages in German or English
+ Sound pack changes apply immediately without restarting the client
- Fix duplicate connection log line when a client is moved (single notifyclientmoved entry only)
- Fix avatars not loading or uploading (missing avatarBufferToDataUrl helper)
- Fix default avatar silhouette visible behind a custom avatar image
- Fix parallel connect attempts causing identity-already-online (521) errors on reconnect

2.4.4:
+ Invite friends from Extras menu or server/channel context menu (gts2server link, HTTP redirect, HTML snippet)
+ Portable edition can launch the bundled installer to install GreenTeaSpeak 2 permanently
- Fix portable client using the same user data folder as the installed app (single-instance lock / silent exit)
- Fix client failing to start after portable-install changes (missing AppInfo import)

2.4.3:
+ Status bar news ticker from greenteaspeak.de (scrolling text with pause between cycles; auto-refresh every 30 seconds)
+ Status bar display options (nickname, identity, ping, server address, connection quality) persist across restarts
- Fix selected microphone and output device not restored after restart — preferences saved to disk and merged on startup
- Fix client volume above 100% (+dB) not making other users audibly louder

2.4.2:
- Fix host banner displayed too small above the channel tree (removed 96px height cap; oldclient banner modes restored)
- Fix own talking indicator staying lit permanently with voice activation (VAD) when not speaking

2.4.1:
- Fix talking indicator stuck on after voice activation (VAD) — server talking flag no longer overrides native playback state
- Fix push-to-talk talking indicator flickering off while the key is still held
- Fix no voice after switching headphones/output device — native device matched by saved name, voice clients re-registered after audio restart, output device applies immediately from settings

2.4.0:

2.3.9:
- Fix sound pack and UI sounds playing on the wrong output device (e.g. TV instead of headphones) — route HTML5 audio via setSinkId using device name matching and persisted browser sink ID
- Fix mojibake in connection log / chat system messages (German umlauts and quotes displayed as garbled text)
- Fix forum identity fallback on foreign TeaSpeak servers: when the server rejects the forum handshake, automatically reconnect with the GreenTeaSpeak identity instead of failing with a misleading login error
- Fix forum badges not appearing after switching from forum to normal identity (badges re-synced on connect and tab switch)
- Fix talking indicator (blue glow) showing for clients in other channels — only peers in your own voice channel are highlighted now
+ Channel tree popout window (oldclient-style) with hover button in the channel tree
+ View preferences persist (toolbar, server tabs, status bar, master volume, host banner, info panel)
+ Info panel (right) can be hidden for compact layout; tree stays visible
+ Compact window mode (480px fixed width) when info panel is hidden

2.3.8:
- Fix remaining startup paths that still opened native audio (bootstrap native status, sound-pack output routing)
- Audio settings use browser device list only (no miniaudio in settings); native voice opens on server connect; device names matched by label

2.3.7:
+ Native crash dump reporter (Tea[*]Speak-style): minidump + crash window with dump path on main/renderer crash
+ Dev: `npm run crash-test` triggers a test crash and opens the reporter window

2.3.6:
- Sound pack + UI sounds route to the configured output device (setSinkId), not always system default speakers
- Deafen also mutes the microphone (TeamSpeak-style); undeafen restores mic unless it was muted before

2.3.5:
- Import Tea[*]Speak 3 soundpacks (folder / .zip / .ts3_soundpack with settings.ini) or native GTS2 packs in Settings → Sounds
- Sound Pack as nested submenu under Selbst (Tea[*]Speak-style), with checkmark on active pack
- Drop-in soundpack folders: create/open folder under userData/soundpacks, drop WAVs or settings.ini — auto-detected on refresh
- Favorites: allow multiple bookmarks for the same server address with different names
- Fix Connect dialog: Verbinden waited until after window.close() and never started the connection
- Toolbar: Away → Mute → Deaf → separator → Subscribe → Screen → Camera; Connect / Server list / Disconnect only under Verbinden menu
- Fix Serverliste menu icon (was same as Verbinden; now client-weblist)
- Fix Beenden / Strg+Q / window X: fully quit (no hide-to-tray on close)
- Fix identity import security level (wrong TomCrypt public-key flag showed 0; export now keeps hash-cash offset)
- Fix profile avatar: show uploaded image immediately (preview returned from upload)
- Fix microphone activation threshold at startup: apply saved settings before bootstrap and sync VAD on connect
- Fix Push-to-Talk: no longer auto-mutes when enabling PTT or on startup (idle PTT ≠ muted)

2.3.4:
- Fix global Push-to-Talk in background via WH_KEYBOARD_LL in main (works unfocused/tray; no RIDEV_NOLEGACY freeze)
- Fix PTT when binding is Ctrl/Alt/Shift (map L/R modifier VKs; no GetAsyncKeyState inside hook)
- GetAsyncKeyState 10ms poll backup (Discord-style) if LL hook is starved
- System tray like Tea[*]Speak: X hides to tray; double-click / menu to show; mute, disconnect, quit from tray

2.3.3:
- Fix global Push-to-Talk in background: run teaclient_ppt in an Electron utilityProcess (renderer was throttled when unfocused; main RIDEV_NOLEGACY freezes UI)

2.3.2:
- Local client/bot volume: oldclient-style dB dialog for users; re-apply native VoiceClient volume when clients talk
- Global Push-to-Talk outside the window via teaclient_ppt in preload (not Electron main)
- License badge: only servers with version like `2.5.1 [Build: …]` are GreenTeaSpeak; `TeaSpeak 1.4.x…` shows "Kein GreenTeaSpeak-Server"
- Tidy client context menu: nest Info / Move / Moderation / Audio; shorter labels

2.3.1:
- Wire Sprachlautstärke (and Aufnahmelautstärke) to native playback/capture volume — slider previously only wrote localStorage

2.3.0:
- Push-to-Talk / voice idle no longer sets client mute: not transmitting looks dark (no talk), not muted; real mute stays a separate mic toggle

2.2.9:
- Fix local mute/volume/latency for users and music bots under native voice (settings were only applied to the unused WebAudio path)

2.2.8:
- Fix Push-to-Talk sticking open after release: native send enable/disable race + key-up ignored when modifiers differed; release remutes reliably (hold = talk, release = mute)

2.2.7:
- Fix Push-to-Talk actually transmitting: Space binding was saved as a literal space character and never matched; PTT now works while chat is focused; main-window key path + setPttHeld no longer no-ops

2.2.6:
- Fix complete UI freeze on startup: do not attach teaclient_ppt in the Electron main process (RIDEV_NOLEGACY Raw Input blocked keyboard/mouse for Chromium). Push-to-Talk still works in the focused window (Space by default)

2.2.5:
- Fix Push-to-Talk: wire native teaclient_ppt for global key capture (works while another window has focus), default key Space, stop persisting momentary unmute into audio prefs, sync mic send after connect
- Fix chat parity with oldclient: private chats keyed by unique id (survive reconnect), server chat (targetmode 3) sendable again, send/receive sounds and timestamps aligned
- Selecting a client who leaves the server now switches back to server info instead of polling getconnectioninfo (stops "Fehler (512): invalid clientID" spam)
* License label for hoster tier: "Authorized GreenTeaSpeak Host Provider"

2.2.4:
- Fix "too many clones connected (hwid)" on foreign TeaSpeak servers: every install now has its own hardware id instead of the shared static "gts2-native" (that made every GTS2 user look like the same machine)
- Untagged clientinit rejections are no longer silently swallowed — connect fails immediately with the real server message instead of hanging for 30s
+ Auto-improve identity security level when a server demands a higher level (0x207) and reconnect once

2.2.3:
- Fix joining foreign TeaSpeak servers that silently ignore the forum identity proof (no error, just a 20s timeout): any forum handshake failure now triggers the automatic retry with the GreenTeaSpeak identity
* Forum handshake timeouts reduced from 20s to 8s so the identity fallback kicks in quickly

2.2.2:
+ Client log files for diagnostics: every session writes a log to %APPDATA%/GreenTeaSpeak 2/logs (connection log, protocol/handshake output, errors, system info)
+ Menu entry Extras -> "Client Protokoll" (Ctrl+L) now opens the log folder
* Log housekeeping: keeps the last 10 files, 20 MB cap per file

2.2.1:
- Fix joining foreign TeaSpeak servers while logged into the forum: when a server rejects the forum identity, the client now automatically reconnects once with the GreenTeaSpeak identity (oldclient users had to switch profiles manually)
- Honest error message when a server cannot verify the forum identity (previously a misleading "please re-login to the forum")
- Fix "failed to resolve hostname" on domains that only have an SRV record: SRV lookup timeout raised from 600ms to 3s for slow DNS resolvers
* All visible product wording now says GreenTeaSpeak (identity labels, profile manager, error messages)

2.2.0:
! Third-party server support removed — TeaSpeak/GreenTeaSpeak is the only supported target
- Fix connect failures with normal (non-forum) identities: the TeaSpeak identity handshake now always runs (no legacy clientinit fallback)
+ Native file transfer implemented (raw TCP, oldclient wire protocol) — downloads and uploads work on native connections
+ Server group / channel group icons load again (ftinitdownload now sends seekpos=0 and proto=1 like the oldclient — fixes the "seekpos" parser kick)
+ File transfers use the SRV/DNS-resolved server host (fixes ENOTFOUND on domains without an A record)
+ Host banner sits above the channel tree like the oldclient: full width, aspect-ratio scaling, click opens the hostbanner URL, periodic gfx refresh, no placeholder without a banner
+ Connect dialog is a standalone window: compact by default, "More" reveals advanced settings, window height auto-fits the form
+ MusicBot "Add song" dialog (Enter song URL) replaces the browser prompt
+ MusicBot "Manage bot" opens the Playlist Manage window: name, channel commander, priority speaker, replay mode, max playlist size, delete played songs, song-change notification
+ Playlist Manage permissions tab: view/edit playlist permissions, client-specific permissions via uid/dbid search, list clients with own permissions
+ Saved microphone/audio settings are applied at client start (not only after opening the settings window)
* Icon download failures are logged in the main process console ([icons] ...)

2.1.8:
- Stop repeated "Fehler (256): command not found" spam on servers that do not support optional TeaSpeak commands
* Auto-disable unsupported optional commands per session (`setconnectioninfo`, `requeststreaminfo`) after first "command not found"
- Fix connect-time server kick "Invalid argument (failed to parse seekpos as m (stoull))" on affected TeaSpeak forks by skipping native remote icon file-transfer probes

2.1.7:
+ Settings list native miniaudio devices (voice:get-devices) instead of browser device ids — selections now reach the native voice backend
+ Device selection works before the first connect (standalone native controller) and saved devices are applied when native voice initializes
- Live input device switch: stop → set_device → start recorder cycle (oldclient pattern) — voice send no longer dies after changing the microphone
- "default" / stale device ids resolve to the real OS default device instead of failing silently
* Mic test maps the selected native device to the matching browser device by label

2.1.6:
+ Inline nickname rename in channel tree: click your own selected entry to edit (classic client style)
+ Server log entry when a client changes their nickname ("X changed his nickname from ...")
+ Local permission DB: catalog served from memory/disk snapshot, background refresh (oldclient-fast editor open)
+ Screen/camera share buttons are disabled with tooltip when b_video_screen / b_video_camera is missing
- Fix access violation (0xC0000005) on quit/disconnect: detach native callbacks, grace period before destroying the server connection
+ Main-process package @greentea/native-bridge (loader, NativeProtocolClient, NativeVoiceController)
+ Hardcoded PermissionType enum + group_mapping (1:1 oldclient) in @greentea/ipc-contracts
* Default transport/voice: honeybbq + WebAudio (native spawn_server_connection crashes on Electron 33; opt-in GTS_TRANSPORT=native)
* Native command stream: one notify row per event (fixes multi-user talking/mute/tree status)
* Native voice: register clients on enter, talking from playback state, skip renderer WebAudio
* Runtime diagnostics report real native load status; electron-builder packs native/build → resources/natives
* npm scripts: build-natives, rebuild-natives:clean, verify:native-abi
* Talking indicators in channel tree for all visible clients (oldclient), not only own channel
- Channel tree: subscribe + clientlist before UI "connected" (oldclient cold tree — no fake join trickle)
- Native clientlist: accumulate response rows for execCommandWithResponse
- Screen/camera share: use 1.6 Mbps default (oldclient); 4 Mbps exceeded i_video_max_kbps (2500) → permission 2568 for non-admins
- Updater: Accept-Encoding identity, gzip magic check, clearer errors for zlib "invalid block type"

2.1.5:
* HoneyBBQ: wrap diagnostics and always-ACK path kept (survives packet-id generation wrap with fixed server ACK match)
- Forum renew: use web-api/v1/renew&auth_key (works with fixed forum API)
* Online seit: live duration from client_lastconnected for users

2.1.4:
+ Modern favorites manager: search, grouped fields, connect in footer, Settings-aligned look
+ Modern identity/profiles window: side-by-side layout, status pills, German UI
+ Persist local client volume/mute/latency by unique ID (oldclient parity, per server)
* Keepalive: setconnectioninfo every 5s, whoami every 15s; quieter protocol logs (less audio hitch)
- VoiceSession: only re-apply output device / volume / latency when values change (avoid audio clicks)
- Updater: longer download timeout for large tar.gz (avoid truncated gzip / invalid stored block lengths)
- Fix client connection info all-zeros (concurrent getconnectioninfo notify collector race)
- Fix ~4h–7h disconnect "Packet resend failed": ACK every command by cleartext header id, even when decrypt fails at packet-id wrap
* HoneyBBQ: decrypt failures now logged (id/type/generation) instead of silently dropping the packet
* HoneyBBQ: wrap diagnostics — duplicate command re-delivery and send/recv generation changes logged with timestamps
* HoneyBBQ: receive window half-range (32768), circular isInWindow/isOldPacket, decrypt gen fallback ±4
- Forum identity: auto-renew via auth-key before connect (no hard 48h block while session is valid)
- Forum renew: correct API route (web-api/v1/renew with auth_key) — previous route returned 404, renew never worked

2.1.3:
+ Updater window like oldclient: installed vs latest version, download progress bar and log
+ Kick/Ban reason dialogs (Electron has no window.prompt — Cancel no longer kicks)
+ Modern settings shell: searchable sidebar, page headers, grouped cards, toggle switches
* Slow channel-tree clientlist poll from 10s to 20s to reduce command pressure
- Fix main-process crash ERR_SOCKET_BAD_PORT on UDP send after disconnect (HoneyBBQ safe send + ignore benign socket errors)
- Fix connect timeout: wait for identity-proof ACK before clientinit (TeaSpeak rejects early clientinit with not logged in)
- Clearer handshake errors (forum outdated / proof failed) instead of remapping every timeout to forum login
- Fix TeaSpeak handshake: use return_code so server emits proof ACK before clientinit

2.1.2:
+ Music bot: play channel files via ChannelProvider (Add file → file browser picker)
+ File browser: multi-select upload (upload several files in one go)
+ File browser: create folder via inline name field (Electron has no window.prompt)
+ File browser: upload/download progress bar (bytes + percent, multi-file index)
+ File browser opens in its own Electron window (like icon viewer / server list)
+ File browser: multi-select (Ctrl/Shift+click, Ctrl+A) for batch delete / bot playlist add
- Fix finished playlist songs sticking in the UI (handle notifyplaylistsongremove / replace on force reload)
- Fix connection drop "Packet resend failed" after long sessions (ACK wrap-around in GenerationWindow)
* HoneyBBQ patch: treat half-range packet IDs as old duplicates (oldclient parity)

2.1.1:
+ Responsive info panels (container queries) — detail views adapt when the window is not maximized
+ Modern microphone capture settings with TS3-style level meter (−50…+50, live fill, draggable threshold)
* Server tabs: hide tab strip with a single connection; show tabs from the second connection (oldclient)
* Mute system like oldclient: persist mute/deafen, copy state to new tabs, no force-mute on tab switch
- No microphone activated/muted WAV on connect or tab switch — only on explicit user toggle
- Fix music bot playlist not loading (always fetch clientinfo for client_playlist_id in full getBotInfo)
- Fix stale bot "now playing" title for radio streams (sync player_title / refresh live clientinfo)
- Fix command-queue lag from getconnectioninfo pollers (coalesce + cache, gentler UI intervals)
- Fix info panel flashing "Keine Auswahl" while bot/user/channel details are still loading

2.1.0:
+ Redesigned About dialog with Über / Copyright / Lizenz tabs (GreenTeaSpeak Systems branding)
+ Public server list window (Weblist API) with filters, sort, and connect — like the classic client
* Server list runs in its own Electron window; Weblist API is fetched only when that window opens
+ Show disconnect notice dialog when the server forces a leave
- Fix mute / talking / status icons missing after reconnect (e.g. server shutdown)
- Fix music bot talking indicator missing while playing (server talking=0 overwrote voice; sticky player_state)
- Fix music bot subscribe spam after reconnect ("Not running"); defer/retry quietly until protocol is ready
- Answer TeaSpeak notifyconnectioninforequest with setconnectioninfo (same recovery path as oldclient)
- Handle server disconnect immediately on notifyclientleftview (kick/ban/shutdown/timeout), like oldclient
- Fix kick: disconnect tab + show kick reason in log/dialog (was sound-only while staying connected)
- Fix badge configure dialog: equipped badges no longer vanish right after drop (click-after-drop + sync race)
- Fix connection timeout while muted / listening to music bots (extra whoami keepalive every 15s)
* Raise protocol packet idle timeout from 60s to 5 minutes when no UDP is received

2.0.9:
+ Forum badge configure UI (equip slots, redeem codes, team badge always on)
+ Badge changes sync to connected servers via client_badges and refresh the UI live
* Keepalive ping every 1s; resume from sleep probes whoami and reconnects if needed
* Channel edit sends only changed fields (avoids full channeledit permission failures)
- Fix badge dialog hang and connection stalls from awaited clientupdate on badge sync
- Fix connection-info polling spam after disconnect (invalid clientID / UDP not running)
- Stop falling back from SVG badges to leftover old PNG artwork

2.0.8:
+ Kick/ban shows who forced you offline and disconnects that tab (no auto-reconnect)
+ Channel kick notice when moved out of a channel
+ Hide ServerQuery clients (serveradmin) by default; show only with view power when enabled
* Channel tree load waits for channellistfinished and batches updates like the classic client
* Apply notifychannelmoved (parent/order) immediately instead of waiting for a poll
- Fix blank "Edit Virtual Server" window (undefined busy variable crash)

2.0.7:
+ Permission editor layout and categories 1:1 from oldclient (group_mapping)
+ Group icons in the permission editor sidebar
+ Icon picker (Edit / Remove / Add) opens Icon Viewer for groups, channels, and server edit
- Fix concurrent icons:list race ("Icon-Liste abgebrochen")

2.0.6:
+ Deep links (gts2server:// / teaclient://) auto-connect; new tab if already connected
* Forum login always sends forum handshake (status/badges) even with a normal identity selected
* Forum badges announced in clientinit so other clients can see them
- Remove unused "GreenTeaSpeak-ID senden" checkbox from Connect dialog

2.0.5:
+ Open gts2server:// (and teaclient://) deep links — fills Connect dialog with host/port
+ Protocol handler registers on packaged installs (Setup) and launches existing instance
* Invite link copy uses gts2server:// instead of ts3server://

2.0.4:
- Protocol client_version now follows package/app-info (no more hardcoded 2.0.0 Alpha)
- Channel edit loads type/limits/advanced flags from channellist cache like the classic client
- Channel needed file powers use correct i_ft_needed_* permission names
- Treat sql no modifications (1283) as success on channel save
- Server chat tab is log-only (not writable)
- Double-click another client opens client-to-client chat
+ Chat context menu (copy, select all, emoticons, line markers, clear)
+ Emoji picker (emoji-mart) on the chat input
+ Changelog dialog under Help ("Changelog lesen")
+ Modern client / channel / server detail panels
* Host banner keeps aspect ratio and crops at the bottom like Tea(*)Speak
* Music bot playlist UI with context menu (play, copy URL, delete)
* Chat background gray; timestamps on all chat lines including system messages
* Channel-edit sound always plays after a successful local channel save

2.0.3:
- Server nicknames: resolve via public directory cache (encrypted local store, ETag refresh)
- Connect shows nickname in UI/log; real host used only internally (DNS prefetched to IP)
- Faster connect path (earlier "connected", post-handshake work in background)
- Voice capture IPC fix (no more invalid transfer / duplicate AudioWorklet errors)
- Play connection.connected on join instead of channel.edited during bootstrap
- DevTools via F12 / Ctrl+Shift+I

2.0.2:
- Away status like the classic client (toolbar toggle, dropdown, away message, tree icon)
- Connect to another server in a new tab (multi-connection tabs)
- Bookmark context menu: Connect, Connect in new tab, Edit favorite
- Cleaner disconnected layout (same proportions as connected, no leftover chat tabs)

2.0.1:
- Hide Query/Template groups unless b_serverinstance_modify_querygroup / modify_templates
- Show server/channel group names in the tree when i_group_show_name_in_tree is Front or Behind
- Editable nickname per bookmark in Favorites manager
- Server "Online since" uses real uptime instead of a placeholder

2.0.0:
+ Secure preload IPC with context isolation and sandbox
+ GreenTeaSpeak-style UI with channel tree, context info, event log and channel chat
+ Client updater via clientapi.greenteaspeak.de/gts2/api.php (setup-installer package)
+ Automatic reconnect after timeout or server drop
+ Classic connection log (host/welcome messages) and poke send/receive dialogs
+ Bookmark management, DNS SRV resolution and persistent server banner support
+ Forum identity with RSA verification, voice, whisper and media foundations
+ Server edit window, icon viewer, and improved client/server details
